{#- 每个消息要实现的模板 -#}
{%- macro render_dpt_msg(dpt_msg) -%}
'''
 ****************************************************************************************************
 * @did     {{ dpt_msg.消息编号 }} -> T{{ dpt_brief.协议代码 }}MsgId.k{{ dpt_msg.消息代码 }}
 * @name    {{ dpt_msg.消息名称 }}
 * @brief   {{ dpt_msg.消息说明 }}
 ****************************************************************************************************
'''
class T{{ dpt_brief.协议代码 }}Msg{{ dpt_msg.消息代码 }}:
    def __init__(self):
        {%- for dpt_data in dpt_msg.data_list %}
        {%- if dpt_data.数据类型 in ['Mem'] %}
        self.{{ dpt_data.数据代码 }} = bytearray()    # {{ dpt_data.数据类型}}, {{ dpt_data.数据名称 }}, {{ dpt_data.数据说明 }}, 数据长度：{{ dpt_data.数据长度 }}
        {%- else %}
        self.{{ dpt_data.数据代码 }} = 0    # {{ dpt_data.数据类型}}, {{ dpt_data.数据名称 }}, {{ dpt_data.数据说明 }}
        {%- endif %}
        {%- endfor %}

    def Encode(self):
        encoder = TDptEncoder()
        {%- for dpt_data in dpt_msg.data_list %}
        {%- if not Dpt_IsNull(dpt_data.数据常量) %}
        self.{{ dpt_data.数据代码 }} = {{ Dpt_PyCodeConstValue(dpt_data.数据常量) }}
        {%- endif %}
        {%- if dpt_data.数据类型 in ['Mem'] %}
        if {{ dpt_data.数据长度 | c2py_data_size }} > 0:
            encoder.Write{{ dpt_data.数据类型 }}(self.{{ dpt_data.数据代码 }}[:{{ dpt_data.数据长度 | c2py_data_size }}])
        {%- else %}
        encoder.Write{{ dpt_data.数据类型 }}(self.{{ dpt_data.数据代码 }}, is_big_endian={{ dpt_brief.字节序反转 }})
        {%- endif %}
        {%- endfor %}
        return encoder.buffer

    def Decode(self, buffer:bytes):
        decoder = TDptDecoder(buffer)
        {%- for dpt_data in dpt_msg.data_list %}
        {%- if dpt_data.数据类型 in ['Mem'] %}
        if {{ dpt_data.数据长度 | c2py_data_size }} > 0:
            self.{{ dpt_data.数据代码 }} = decoder.Read{{ dpt_data.数据类型 }}({{ dpt_data.数据长度 | c2py_data_size }} )
        {%- else %}
        self.{{ dpt_data.数据代码 }} = decoder.Read{{ dpt_data.数据类型 }}(is_big_endian={{ dpt_brief.字节序反转 }})
        {%- endif %}
        {%- endfor %}
        return decoder.ReadPosition()

    def __str__(self):
        return f"*** @did:{{ dpt_msg.消息编号 }}, @name:{{ dpt_msg.消息名称 }}, @brief:{{ dpt_msg.消息说明 }} ***"
{%- endmacro -%}
# -*- coding: utf-8 -*-
#***** File generated by dpt(tool data_protocol_tool). ******
'''
 * @file        {{ var_filename }}.h
 * @brief       XXXX
 * @note        XXXX
 * @author      {{ var_author }}({{ var_email }})
 * @date        {{ var_date }} {{ var_time }}
 * @version     1.0

 * @par         修改日志
 * <table>
 * <tr><th>Date         <th>Version     <th>Author      <th> Description
 * <tr><td>{{ var_date }}   <td>1.0         <td>{{ var_author }}       <td> 创建初始版本
 * @copyright 杭州鸿泉物联网技术股份有限公司
'''
import sys
import os
sys.path.append(os.path.dirname(__file__))
from dpt_coder import *

#----------- 消息编号 -----------#
class T{{ dpt_brief.协议代码 }}MsgId:
{%- for dpt_msg in dpt_msg_list %}
    k{{ dpt_msg.消息代码 }} = {{ dpt_msg.消息编号 }}
{%- endfor %}



#----------- 消息结构体定义 + 编解码函数声明 -----------#
{%- for dpt_msg in dpt_msg_list %}
{{ render_dpt_msg(dpt_msg) }}
{%- endfor %}



